/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package presenter;

import command.ExcluirCommand;
import view.TelaListarPacientes;
import logs.Log;
import persistencia.Pacientes;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import model.Paciente;
import observer.Observador;

/**
 *
 * @author KDC
 */
public class ListarPacientesPresenter implements Observador {

    DefaultTableModel tm;
    PacientePresenter cp;
    Log log;
    Pacientes pacientes;
    TelaListarPacientes view;

    public ListarPacientesPresenter(Log pLog, PacientePresenter cPaciente) {
        view = new TelaListarPacientes(log, cp);
        view.setVisible(true);
        log = pLog;
        //Carregar os pacientes para a memória
        cp = cPaciente;
        cp.carregarPacientes();

        view.setLocationRelativeTo(view.getParent());

        Object colunas[] = {"Nome", "Altura", "Peso"};
        tm = new DefaultTableModel(colunas, 0);
        carregaPacientes();
        view.getTbListaPacientes().setModel(tm);
        log.escreve("Listando todos os pacientes.");

        this.pacientes = cp.getListaPacientes();
        pacientes.registrarObservador(this);

        view.getJbSair().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                view.dispose();
            }
        });

        view.getJbEditar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                editar();
            }
        });

        view.getJbExcluir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                excluir();
            }
        });

        view.getJbPesquisar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                pesquisar();
            }
        });

        view.getTbListaPacientes().addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent me) {
                atualizarLabels();
            }

            @Override
            public void mousePressed(MouseEvent me) {

            }

            @Override
            public void mouseReleased(MouseEvent me) {

            }

            @Override
            public void mouseEntered(MouseEvent me) {

            }

            @Override
            public void mouseExited(MouseEvent me) {

            }
        });

        view.getJtfPesquisar().addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent ke) {
                PesquisarKeyReleased(ke);
            }

            @Override
            public void keyPressed(KeyEvent ke) {
                PesquisarKeyPressed(ke);
            }

            @Override
            public void keyReleased(KeyEvent ke) {
                PesquisarKeyPressed(ke);
            }
        });

    }

    public void atualizarLabels() {

        int linha;
        String pNome;
        linha = view.getTbListaPacientes().getSelectedRow();
        pNome = (String) view.getTbListaPacientes().getValueAt(linha, 0);

        view.getJlClassificIMC().setText(cp.exibeClassificacaoDoMetodo(pNome, "IMC"));
        view.getJlClassificIAC().setText(cp.exibeClassificacaoDoMetodo(pNome, "IAC"));
        view.getJlClassifICC().setText(cp.exibeClassificacaoDoMetodo(pNome, "CC"));
        view.getJlClassifRCQ().setText(cp.exibeClassificacaoDoMetodo(pNome, "RCQ"));

        Paciente p = cp.buscarPaciente(pNome);
        log.escreve("Consultando o Paciente " + p.getNome() + ", peso: " + p.getPeso() + ", altura: " + p.getAltura());
    }

    public void pesquisar() {
        if (view.getJtfPesquisar().getText().equalsIgnoreCase("") && view.getJcSexoPaciente().getSelectedIndex() == 0) {
            carregaPacientes();
        } else if (view.getJcSexoPaciente().getSelectedIndex() != 0 && view.getJtfPesquisar().getText().length() > 0) {
            carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));

        } else if (view.getJcSexoPaciente().getSelectedIndex() != 0) {
            carregaPacientesPorNomeSexo("NULL", view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));
        } else if (view.getJtfPesquisar().getText().length() > 0) {
            carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), 'S');
        }
    }

    public void excluir() {
        ExcluirCommand excluir = new ExcluirCommand(this);
        excluir.executar(this);
    }

    public PacientePresenter getCp() {
        return cp;
    }

    public void setCp(PacientePresenter cp) {
        this.cp = cp;
    }

    public Log getLog() {
        return log;
    }

    public void setLog(Log log) {
        this.log = log;
    }

    public Pacientes getPacientes() {
        return pacientes;
    }

    public void setPacientes(Pacientes pacientes) {
        this.pacientes = pacientes;
    }

    public TelaListarPacientes getView() {
        return view;
    }

    public void setView(TelaListarPacientes view) {
        this.view = view;
    }

    public void editar() {
        try {

            int linha;
            String pNome;
            linha = view.getTbListaPacientes().getSelectedRow();

            if (linha == -1) {
                throw new Exception("Selecione Uma Linha Primeiro!");
            }
            pNome = (String) view.getTbListaPacientes().getValueAt(linha, 0);
            Paciente pPaciente = cp.buscarPaciente(pNome);

            new CadPacientePresenter(pPaciente, cp, log);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }

    public void PesquisarKeyPressed(java.awt.event.KeyEvent evt) {

        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (view.getJtfPesquisar().getText().equalsIgnoreCase("") && view.getJcSexoPaciente().getSelectedIndex() == 0) {
                carregaPacientes();
            } else if (view.getJcSexoPaciente().getSelectedIndex() != 0 && view.getJtfPesquisar().getText().length() > 0) {
                carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));

            } else if (view.getJcSexoPaciente().getSelectedIndex() != 0) {
                carregaPacientesPorNomeSexo("NULL", view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));
            } else if (view.getJtfPesquisar().getText().length() > 0) {
                carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), 'S');
            }

        }

    }

    private void jcSexoPacientePopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {

        if (view.getJcSexoPaciente().getSelectedIndex() == 0) {
            carregaPacientes();
        } else {
            carregaPacientesPorNomeSexo("NULL", view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));
        }

    }

    private void PesquisarKeyReleased(java.awt.event.KeyEvent evt) {

        if (view.getJtfPesquisar().getText().equalsIgnoreCase("") && view.getJcSexoPaciente().getSelectedIndex() == 0) {
            carregaPacientes();
        } else if (view.getJcSexoPaciente().getSelectedIndex() != 0 && view.getJtfPesquisar().getText().length() > 0) {
            carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));

        } else if (view.getJcSexoPaciente().getSelectedIndex() != 0) {
            carregaPacientesPorNomeSexo("NULL", view.getJcSexoPaciente().getSelectedItem().toString().charAt(0));
        } else if (view.getJtfPesquisar().getText().length() > 0) {
            carregaPacientesPorNomeSexo(view.getJtfPesquisar().getText(), 'S');
        }
    }

    private void formWindowGainedFocus(java.awt.event.WindowEvent evt) {

    }

    @Override
    public void atualizar() {

        int linha;
        String pNome;
        linha = view.getTbListaPacientes().getSelectedRow();

        if (linha == -1) {
            carregaPacientes();
        } else {
            carregaPacientes();
            pNome = (String) view.getTbListaPacientes().getValueAt(linha, 0);
            view.getJlClassificIMC().setText(cp.exibeClassificacaoDoMetodo(pNome, "IMC"));
            view.getJlClassificIAC().setText(cp.exibeClassificacaoDoMetodo(pNome, "IAC"));
            view.getJlClassifICC().setText(cp.exibeClassificacaoDoMetodo(pNome, "CC"));
            view.getJlClassifRCQ().setText(cp.exibeClassificacaoDoMetodo(pNome, "RCQ"));

        }

    }

    public void carregaPacientes() {

        tm.setNumRows(0);
        int i;

        for (i = 0; i < cp.getListaPacientes().getPacientes().size(); i++) {

            Paciente pac = (Paciente) cp.getListaPacientes().getPacientes().get(i);
            String c1 = pac.toString();
            String linha[] = c1.split("%");
            tm.addRow(new Object[]{linha[0], linha[1], linha[2]});
        }
    }

    private void carregaPacientesPorNomeSexo(String pNome, char pSexo) {

        tm.setNumRows(0);
        int i;

        for (i = 0; i < cp.getListaPacientes().getPacientes().size(); i++) {

            Paciente pac = (Paciente) cp.getListaPacientes().getPacientes().get(i);

            //Procurar Só Pelo Sexo
            if (pNome.equals("NULL")) {
                if (pac.getSexo() == pSexo) {
                    String c1 = pac.toString();
                    String linha[] = c1.split("%");
                    tm.addRow(new Object[]{linha[0], linha[1], linha[2]});
                }
            } //procurar só pelo nome
            else if (pSexo == 'S') {
                if (pac.getNome().toLowerCase().contains(pNome.toLowerCase())) {
                    String c1 = pac.toString();
                    String linha[] = c1.split("%");
                    tm.addRow(new Object[]{linha[0], linha[1], linha[2]});
                }
            } //procurar por nome e sexo
            else {
                if (pac.getNome().toLowerCase().contains(pNome.toLowerCase()) && pac.getSexo() == pSexo) {
                    String c1 = pac.toString();
                    String linha[] = c1.split("%");
                    tm.addRow(new Object[]{linha[0], linha[1], linha[2]});
                }

            }
        }
    }

}
